package routes

import (
	"fmt"
	"gin-mini-admin/config"
	"gin-mini-admin/middleware"
	"gin-mini-admin/public/common"
	"time"

	"github.com/gin-gonic/gin"
)

// InitRoutes 初始化
func InitRoutes() *gin.Engine {
	//设置模式
	gin.SetMode(config.Conf.System.Mode)

	// 创建带有默认中间件的路由:
	r := gin.Default()

	// 启用全局跨域中间件（这个必须放在最前面）
	r.Use(middleware.CORSMiddleware())

	// 启用限流中间件
	// 默认每50毫秒填充一个令牌，最多填充200个
	fillInterval := time.Duration(config.Conf.RateLimit.FillInterval)
	capacity := config.Conf.RateLimit.Capacity

	// 初始化JWT认证中间件
	authMiddleware, err := middleware.InitAuth()
	if err != nil {
		common.Log.Panicf("初始化JWT中间件失败：%v", err)
		panic(fmt.Sprintf("初始化JWT中间件失败：%v", err))
	}

	// 路由分组
	apiGroup := r.Group("/" + config.Conf.System.UrlPathPrefix)

	// 创建一个不需要认证的路由组
	publicGroup := apiGroup.Group("/base")
	// 注册不需要认证的路由
	InitBaseRoutes(publicGroup, authMiddleware) // 注册基础路由, 不需要jwt认证中间件

	// 需要认证的路由组
	authGroup := apiGroup.Group("")
	// 对需要认证的路由添加中间件
	authGroup.Use(middleware.RateLimitMiddleware(time.Millisecond*fillInterval, capacity))
	authGroup.Use(middleware.OperationLogMiddleware())
	authGroup.Use(authMiddleware.MiddlewareFunc()) // 添加JWT认证中间件
	authGroup.Use(middleware.CasbinMiddleware())   // 添加Casbin鉴权中间件

	// 注册需要认证的路由
	InitUserRoutes(authGroup, authMiddleware)         // 注册用户路由
	InitRoleRoutes(authGroup, authMiddleware)         // 注册角色路由
	InitMenuRoutes(authGroup, authMiddleware)         // 注册菜单路由
	InitApiRoutes(authGroup, authMiddleware)          // 注册接口路由
	InitOperationLogRoutes(authGroup, authMiddleware) // 注册操作日志路由

	common.Log.Info("初始化路由完成！")
	return r
}
